| 간략한 설명 | |
|---|---|
|
파일:
\examples\Processing\Geometry\ScalingLine\ScalingLineP16.va |
|
|
Default Platform: mE5-MA-VCL |
|
|
요약 설명 Scaling 및 라인 스캔 이미지의 변환 |
|
VisualApplets 의 “ScalingLineP8.va” 및 “ScalingLineP16.va”는 CameraLink Full 구성의 그레이스케일 라인 스캔 카메라 이미지를 임의의 배율로 확대·축소하여 입력과 출력 간의 이미지 너비를 변환합니다. “ScalingLineP8.va”는 8개의 병렬 처리를, “ScalingLineP16.va”는 16의 병렬도를 지원하도록 설계되었으며, 이는 marathon VCL 플랫폼용입니다. 이 문서는 VisualApplets 에서 알고리즘과 구현 방법을 설명합니다. 이 설계를 사용하려면 여러 룩업 테이블 값을 계산해야 합니다. 포함된 C++ 및 Matlab 프로그램이 이러한 계산을 수행하여 사용을 간소화합니다.
선 이미지의 크기 조정/변환/왜곡 보정은 원본 및 대상 이미지의 좌표를 기준으로 수행됩니다. 다음에서는 예시 좌표 쌍과 4중 병렬 처리를 통해 알고리즘의 기본 원리를 설명합니다.
목표 좌표: 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13
14 15
원점 좌표: 0.3 0.5 1.4 1.5 | 2.2 3.4 3.6 4.2| 5.4 5.5 7.8 8.5 | 9.1 11.4 13.3 14.1
우리는 ‘타깃-투-소스(Target-To-Source)’ 절차를 사용합니다. 타깃 이미지(=PC로 출력되는 이미지)의 각 픽셀에 대해, 소스 이미지 내에서 해당 (반올림된) 정수 좌표 와 해당 픽셀 값을 선택합니다. 픽셀 간의 위치는 소스 이미지에서 현재 픽셀 좌표의 바로 앞 인접 픽셀도 함께 선택함으로써 고려됩니다. 선형 보간법을 통해 출력 이미지의 올바른 픽셀 값이 계산됩니다. 병렬 처리의 특성상 소스 이미지에서 단일 픽셀을 읽을 수는 없습니다. 따라서 “워드”(동시에 읽히는 픽셀의 단위 )를 유용한 순서대로 읽어들여야 합니다. 어떤 단어는 한 번 이상 읽혀야 할 수도 있고, 전혀 읽히지 않을 수도 있습니다. 원본 이미지에서 읽혀진 이러한 단어 내에서, 출력 단어를 생성하기 위한 올바른 픽셀 위치를 선택해야 합니다. 읽혀진 단어에서 필요하지 않은 픽셀은 삭제됩니다. 다음 예제는 원본 이미지 좌표에 대한 읽기 액세스를 보여줍니다:
| 메모리 읽기 횟수 사이클 | 요청된 목표 좌표 | 각 소스의 좌표 | Word 읽기 / 픽셀 포함 | Word에서 Pixel 사용 |
|---|---|---|---|---|
| 1 | 0, 1 2, 3 | 0.3, 0.5, 1.4, 1.5 | 0/ 0, 1, 2, 3 | 1, 1, 2, 2 |
| 2 | 4 | 2.2 | 0/ 0, 1, 2, 3 | 3, x, x, x |
| 3 | 5, 6, 7, 8 | 3.4, 3.6, 4.2, 5.4 | 1/ 4, 5, 6, 7 | 4, 4, 5, 6 |
| 4 | 9 | 5.5 | 1/ 4, 5, 6, 7 | 6, x, x, x |
| 5 | 10, 11, 12 | 7.8, 8.5, 9.1 | 2/ 8, 9, 10, 11 | 9, 8, 10, x |
| 6 | 13, 14, 15 | 11.4, 13.3, 14.1 | 3 / 12, 13, 14, 15 | 12, 14, 15, x |
표 24. 독서 주기
한편, “x”는 해당 픽셀이 삭제되었음을 나타냅니다.
이 설계의 주요 구성 요소는 다음과 같습니다(그림 335):
1. 트리거 시스템 및 버퍼를 포함한 라인 스캔 카메라용 인터페이스;
2. 카메라 이미지의Scaling ( 변환 ); xml-ph-0000@deepl.internal 3. PC로의 DMA 데이터 전송; xml-ph-0000@deepl.internal 4.);
3. PC로의 DMA 데이터 전송;
다음에서는 주요 구성 요소에 대해 설명하겠습니다. 변환 에 대해 자세히 설명하겠습니다.
다음의 구성 요소를 확인할 수 있습니다. 변환 의 구성 요소를 확인할 수 있습니다.
카메라 라인 스캔 이미지의 스케일링은 ‘타깃-투-소스(Target-To-Source)’ 방식으로 수행됩니다. WordToRead에서는 입력 카메라 이미지에서 8 („ScalingLineP8.va”의 병렬 처리 8) 또는 16 („ScalingLineP16.va”의 병렬 처리 16) 픽셀 단위(= ”단어”)가 어떤 유용한 순서로 읽힐지 선택합니다. PixelPicker 에서는 읽어들인 ‘워드’ 중에서 어떤 픽셀이 필요한지 결정합니다. 보간 은 출력 이미지의 픽셀 값을 계산할 때 원본 이미지 내의 픽셀 간 위치를 고려합니다.
WordToRead 모듈의 구성 요소는 그림 337에 나와 있다.
소스 이미지에서 읽을 단어의 순서와 빈도는 다음에서 정의됩니다. LUT: WordsToRead에서 정의됩니다. 이 테이블의 내용은 외부 C++ 프로그램 „ScalingLUTS.cpp” 또는 MATLAB 모듈 “LUTS_Scaling.m” 및 “ScalingTablelLine.m”을 사용하여 생성됩니다. 이에 대해서는 본 문서의 ‘ ’ 절을 참조하십시오. 이 조회 테이블의 입력 링크는 CreateBlankImage 및 Coordinate_X로 정의됩니다. 매개변수 ImageWidth 의 CreateBlankImage 의 매개변수ImageWidth값은 LUT의 요소 수와 정확히 일치해야 합니다: WordsToRead의 요소 수와 정확히 일치해야 합니다. 매개변수 ImageHeight 는 소스 이미지의 y축 방향 이미지 크기와 일치해야 합니다. 소스 이미지의 단어는 버퍼 LineMemoryRandomRd_1 및 LineMemoryRandomRd_2버퍼에서 에서 LUT: WordsToRead에 의해 정의된 순서대로 읽힙니다. 소스 이미지는 이 버퍼들에 선형적으로 기록됩니다. 여기서 최대 비트 심도가 64비트이고 병렬도가 1이므로 두 개의 버퍼가 필요합니다. 각 워드에 대해, 바로 앞 워드의 마지막 픽셀이 선택되어 읽힙니다( SYNC 바로 위의 연산 라인)에서 읽힙니다. 이 값은 연산자 Merge연산자를 사용하여 해당 워드에 더해진 후, 해당 워드의 마지막 픽셀이 선택되어 읽힙니다(연산자를 사용하여 해당 워드에 더해진 후,다음 워드로 전송됩니다.
모듈 내 PixelPicker (그림 338 참조)에서는 크기 조정된 출력 단어의 픽셀이 Pick_0 부터 Pick_15 (또는 Pick_7 , 병렬도 8)을 적용하여 읽은 단어에서 추출합니다. 읽은 단어의 픽셀이 필요하지 않은 경우( 절 참조) 조회 테이블이 RemovePixel 해당 픽셀을 삭제합니다. 앞서 언급된 테이블(Pick_0 부터 Pick_15 및 RemovePixel)은 외부 C++ 프로그램 „ScalingLUTS.cpp”를 사용하거나, 또는 MATLAB 모듈 “LUTS_Scaling.m” 및 “ScalingTablelLine.m”을 사용하여 생성할 수 있습니다. 이에 대해서는 본 문서의 절도 참조하십시오.
그림 3 39에서 HierarchicalBox의 내용은 다음과 같습니다. Pick_0 의 내용이 표시되어 있습니다. 조회 테이블 PickComponent0 는 읽은 단어(SelectFromParallel: Word 및 Coordinate_X: Number)의 어느 픽셀이 현재 출력 단어의 0번 구성 요소인지 정의합니다. 연산자 CASE 를 통해 해당 픽셀이 선택됩니다. 이 픽셀은 이전 픽셀과 합쳐져 현재 픽셀에 기록됩니다 (MergePixel). 앞서 설명한 절차와 유사하게, 현재 출력 워드의 픽셀 1~15(또는 병렬도 8일 경우 7)가 모듈 Pick_1 부터 Pick_15 (또는 Pick_7까지). 개별 픽셀 Pick_0 에서 Pick_15까지의 단일 픽셀을 선택합니다 (또는 Pick_7)는 병렬도 16 또는 8을 사용하여 현재 변환/확대된 단어와 결합됩니다 (MergeParallel (그림 338 참조)로 병합됩니다.)
PC로 전송되는 출력 이미지의 픽셀 위치에서 올바른 값을 얻기 위해서는 원본 이미지의 픽셀 간 위치 를 고려해야 합니다. 이 모듈에서는 보간 모듈(그림 336)에서는 선형 보간이 수행됩니다 [Bur06]:
여기서
는 출력 이미지의 픽셀 값이며,
이는 값
원본 이미지에서
x 위치에 있습니다. 또한
및
픽셀 좌표에 해당하는 값은 다음과 같습니다.
및
원본 이미지에서. 픽셀 간 위치는
. 선형 보간에 대한 자세한 내용은
예를 들어 [Bur06]을(를) 참조하십시오.
이 모듈의 내용 보간 (은)는 그림에 표시되어 있습니다. 340.
현재 픽셀의 값
그리고 그들의
선대들
연산자로 구분됩니다
SelectBitField: 현재 및 SelectBitField: 이전. 다음 값들은
및
다음과 곱해집니다.
및
식에 따라
30. 픽셀 간 위치에 대한 정보
네 개의 조회 테이블에 포함되어 있습니다
분수_부분0 에서 분수_3부 “ScalingLineP16.va” 설계에서. 각 테이블에는
현재 출력 워드의 4픽셀에 해당하는 픽셀 간 위치가 포함되어 있습니다.
.
모든 픽셀 간 위치의 비트 심도는 6비트입니다. LUT의 내용은 분수_부분0 에서 분수_3부 다음은
외부 C++ 프로그램 „ScalingLUTS.cpp”를 사용하거나, 또는 MATLAB 모듈 “LUTS_Scaling.m” 및
“ScalingTablelLine.m”을 사용하여 생성할 수 있습니다. 이에 대해서는
해당 절을 참조하십시오. 이 문서에서.
“ScalingLineP8.va” 설계에는 픽셀 간
위치를 포함하는 Fractional 테이블이 하나 있습니다. 이 테이블의 내용은 외부 C++ 및 Matlab 프로그램 모듈을 사용하여 생성할 수도 있습니다.
마지막으로, 변환 및 크기 조정된 선 이미지는 DMA 전송을 통해 PC로 전송됩니다(그림 참조). 336).
“ScalingLineP16.va” 및 “ScalingLineP8.va” 설계에 필요한 조회 테이블(“ ” 절 참조)은 C++ 프로그램 “ScalingLUTs.cpp”(“LUTS_Cpp” 폴더 내)를 사용하거나, MATLAB 프로그램 모듈 “LUTS_Scaling.m” 및 “ScalingTableLine.m”(“LUTS_Cpp” 폴더 내)을 사용하여 생성할 수 있습니다. “ScalingLUTs.cpp”(“LUTS_Cpp” 폴더 내)를 사용하거나 MATLAB 프로그램 모듈 “LUTS_Scaling.m” 및 “ScalingTableLine.m”( “LUTS_MATLAB” 폴더 내)를 사용하여 생성할 수 있습니다.
1. 프로그램(또는 명령 프롬프트)에서 다음 매개변수를 정의해 주십시오:
//////////////////////Parameter////////////////////
/ 다음 매개변수를 지정해 주세요!//////////
uint64_t parallelism = 8; // “ScalingLineP8.va”의 경우 =8, “ScalingLineP16.va”의 경우 =16
uint64_t fractionalBits = 6; // = 6: "ScalingLineP8.va" 및 "ScalingLineP16.va"의 기본값
uint64_t noOfFractionalLUTs = parallelism == 8 ? 1 : 4; // 소수점 테이블 수 = "ScalingLineP8.va"에서는 1,
"ScalingLineP16.va"에서는 4
int InputWidth; // 입력 이미지의 너비
int OutputWidth; // PC로 전송되는 이미지의 너비
VisualApplets 의 “ScalingLineP16.va” 설계에서는 병렬 처리 매개변수를 16으로, “ScalingLineP8.va”에서는 8로 설정하십시오. 6인 fractionalBits의 값은 두 설계 모두에서 기본값입니다. “ScalingLineP16.va” 설계에는 보간을 위한 픽셀 간 위치를 포함하는 네 개의 테이블(const int noOfFractionalLUTs = 4)이 있습니다 (그림 340 참조). 반면 “ScalingLineP8.va” 설계에는 하나의 테이블(const int noOfFractionalLUTs = 1)이 있습니다. 라인 이미지의 스케일링은 InputWidth 와 OutputWidth 간의 관계에 의해 정의됩니다.
2. 프로그램을 실행하세요!
3. 다음 파일들이 생성되며, 이 파일들은 ‘ VisualApplets ’ 설계의 조회 테이블에 불러올 수 있습니다:
| 파일 | VA LUT |
|---|---|
| FractionalTable_0.txt 에서 FractionalTable_3.txt | Fractional_Part0 (또는 병렬 처리 수준 8의 경우 Fractional)을 FractionalPart_3 |
| PickerTable_0.txt 에서 PickerTable_15.txt (또는 PickerTable_7.txt) | PickComponent0 에서 PickComponent15 (또는 PickComponent7) |
| TableWordsToRead.txt | 읽을 단어 |
| RemoveTable.txt | RemovePixel |
표 25. Visual Applets의 파일 및 해당 조회 테이블
또한 텍스트 파일 ScalingTable.txt 가 생성됩니다. 이 파일에는 각 출력 이미지 픽셀에 대해 원본 이미지 내의 해당 좌표가 포함되어 있습니다( 절도 참조).
“ScalingTableLine.m” 모듈을 열고 매개변수를 정의해 주세요.
InputWidth=…;
OutputWidth=…;
1. 프로그램을 실행하세요!
2. ScalingTableLine.txt라는 텍스트 파일이 생성됩니다. 이 파일에는 출력 이미지의 각 픽셀에 대해 원본 이미지 내의 해당 좌표가 포함되어 있습니다.
3. “LUTS_Scaling.m” 모듈을 열고 매개변수를 정의해 주세요.
병렬 처리 = ...;
NoOfFractionalBits=...;
NoOfFractionalTables=...;
프로그램을 실행하세요! 생성된 파일들은 표 25에 나열된 파일들과 일치하며, 이 파일들은 ‘ VisualApplets ’ 설계의 조회 테이블에 불러올 수 있습니다.


이전

